]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
focus-manager: Make groups "refcounted"
authorFlorian Müllner <fmuellner@gnome.org>
Fri, 14 Sep 2012 15:55:42 +0000 (17:55 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Fri, 14 Sep 2012 22:17:44 +0000 (00:17 +0200)
Rather than unconditionally removing a focus root in remove_group(),
decrement a counter that add_group() increments, and only actually
remove a focus root when the counter drops to 0.

https://bugzilla.gnome.org/show_bug.cgi?id=682243

src/st/st-focus-manager.c

index 85acf293b92a04ca659ef57370428d0b17dec852..e12ec4689906f672bd08f9cdb8f2926e14492fd9 100644 (file)
@@ -180,10 +180,13 @@ void
 st_focus_manager_add_group (StFocusManager *manager,
                             StWidget       *root)
 {
+  gpointer count_p = g_hash_table_lookup (manager->priv->groups, root);
+  int count = count_p ? GPOINTER_TO_INT (count_p) : 0;
+
   g_signal_connect (root, "destroy",
                     G_CALLBACK (remove_destroyed_group),
                     manager);
-  g_hash_table_insert (manager->priv->groups, root, GINT_TO_POINTER (1));
+  g_hash_table_insert (manager->priv->groups, root, GINT_TO_POINTER (++count));
 }
 
 /**
@@ -197,7 +200,15 @@ void
 st_focus_manager_remove_group (StFocusManager *manager,
                                StWidget       *root)
 {
-  g_hash_table_remove (manager->priv->groups, root);
+  gpointer count_p = g_hash_table_lookup (manager->priv->groups, root);
+  int count = count_p ? GPOINTER_TO_INT (count_p) : 0;
+
+  if (count == 0)
+    return;
+  if (count == 1)
+    g_hash_table_remove (manager->priv->groups, root);
+  else
+    g_hash_table_insert (manager->priv->groups, root, GINT_TO_POINTER(--count));
 }
 
 /**